package com.nky.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.nky.mapper.MenuMapper;
import com.nky.pojo.Menu;
import com.nky.service.IMenuService;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.stream.Collectors;

@Service
public class MenuServiceImpl extends ServiceImpl<MenuMapper, Menu> implements IMenuService {

    /**
     * 根据传入的字符模糊匹配所有菜单，及其子菜单
     *
     * @param menuName 需要匹配的菜单名称字符
     * @return 菜单及其子菜单列表
     */
    @Override
    public List<Menu> findMenus(String menuName) {
        LambdaQueryWrapper<Menu> queryWrapper = new LambdaQueryWrapper<>();
        //queryWrapper.orderByDesc("id");
        if (StrUtil.isNotBlank(menuName)) {
            // 模糊查询，菜单名称中含有指定字符的均有效
            queryWrapper.like(Menu::getMenuName, menuName);
        }
        // 生成子菜单
        // 父子集关系id和pid实现自关联，查询的时候要设置查询条件
        // 查询所有数据
        List<Menu> list = list(queryWrapper);
        // 在所有的数据里找到pid为null的数据就是一级菜单
        List<Menu> parentNodes = list.stream().filter(menu -> menu.getPid() == null).collect(Collectors.toList());
        // 找到一级菜单的子菜单
        for (Menu menu : parentNodes) {
            // list.stream().filter(m -> menu.getMenuId().equals(menu.getPid())).collect(Collectors.toList());//javase比较两个包装类型的数据，迭代器
            //从list里面找到当前m的pid等于父级菜单的ID，筛选所有数据中pid=父级id的数据就是二级菜单
            menu.setChildren(list.stream().filter(m -> menu.getMenuId().equals(m.getPid())).collect(Collectors.toList()));
        }
        return parentNodes;
    }
}
